// #include <cstddef>
#include <klib.h>
#include <klib-macros.h>
#include <stdint.h>

#if !defined(__ISA_NATIVE__) || defined(__NATIVE_USE_KLIB__)

size_t strlen(const char *s) {
  const char *p = s;
  while(*p) p++;
  return p-s;
  //panic("Not implemented");
}

char *strcpy(char *dst, const char *src) {//标准库行为：返回目标的地址
  if(!dst || ! src){
    return NULL;
  }
  char *ret = dst;
  while((*dst++ = *src++)!= '\0');//
  return ret;
  //panic("Not implemented");
}

char *strncpy(char *dst, const char *src, size_t n) {
  panic("Not implemented");
}

char *strcat(char *dst, const char *src) {
  if(!dst || !src) return NULL;
  size_t len = strlen(dst);
  size_t i;
  for(i=0;src[i];i++) dst[len+i] = src[i];
  dst[len+i]='\0';
  return dst;
  //panic("Not implemented");
}

int strcmp(const char *s1, const char *s2) {
  while(*s1  && (*s1 == *s2)) s1++,s2++;
  return *(unsigned char*)s1 - *(unsigned char*)s2;
  //panic("Not implemented");
}

int strncmp(const char *s1, const char *s2, size_t n) {
  panic("Not implemented");
}

void *memset(void *s, int c, size_t n) {
  unsigned char *ptr = s;  // 将 void * 转换为 unsigned char *
  while (n--) {
    *ptr = (unsigned char)c;  // 设置每个字节
    ptr++;  // 移动到下一个字节
  }
  return s;  // 返回原始的指针
  //panic("Not implemented");
}

void *memmove(void *dst, const void *src, size_t n) {
  // 如果源地址和目标地址相同，则直接返回目标地址
    if (dst == src) {
        return dst;
    }

    // 定义两个指针，分别指向源地址和目标地址
    unsigned char *d = dst;
    const unsigned char *s = src;

    // 如果目标地址在源地址之后，我们需要从后往前复制数据
    if (d < s || d >= s + n) {
        // 没有重叠，或者目标地址在源地址的后面
        while (n--) {
            *d++ = *s++; // 按字节复制
        }
    } else {
        // 如果目标地址在源地址的前面，我们从后往前复制
        d += n;
        s += n;
        while (n--) {
            *(--d) = *(--s); // 逆向复制
        }
    }

    return dst;
  //panic("Not implemented");
}

void *memcpy(void *out, const void *in, size_t n) {
  unsigned char *dest = (unsigned char *)out;  // 目标地址
  const unsigned char *src = (const unsigned char *)in;  // 源地址

  // 复制字节
  while (n--) {
    *dest++ = *src++;  // 逐字节复制
  }

  return out;  // 返回目标地址
  //panic("Not implemented");
}

int memcmp(const void *s1, const void *s2, size_t n) {
  unsigned char *ptr1 = (unsigned char *)s1;  // 将 s1 转为 unsigned char *
  unsigned char *ptr2 = (unsigned char *)s2;  // 将 s2 转为 unsigned char *

  // 比较每个字节
  while (n--) {
    if (*ptr1 != *ptr2) {
      return *ptr1 - *ptr2;  // 如果不相等，返回差值
    }
    ptr1++;
    ptr2++;
  }

  return 0;  // 如果完全相同，返回 0
  //panic("Not implemented");
}

#endif
